'''
编写一个函数，获取一个正整数的二进制形式并返回其二进制表达式中设置位的个数（也被称为汉明重量）。
示例 1：
输入：n = 11
输出：3
解释：输入的二进制串 1011 中，共有 3 个设置位。
示例 2：
输入：n = 128
输出：1
解释：输入的二进制串 10000000 中，共有 1 个设置位。
示例 3：
输入：n = 2147483645
输出：30
解释：输入的二进制串 11111111111111111111111111111101 中，共有 30 个设置位。
提示：1 <= n <= 231 - 1
进阶：如果多次调用这个函数，你将如何优化你的算法？
'''
class Solution():
    """
    :type n: int
    :rtype: int
    """
    #Brian Kernighan算法: n & (n-1) 会清除n的二进制表示中的最低位的1
    def hammingWeight(self, n: int) -> int:
        #n<=0返回-1
        if n == 0:
            return -1

        count = 0
        while n:
            n &= (n - 1)
            count += 1
        return count
    #取余法
    def hammingWeight2(self, n: int) -> int:
        #n<=0返回-1
        if n == 0:
            return -1

        count = 0
        while n:
            if n%2 == 1:
               count += 1
            n = n//2
        return count
#示例
if __name__ == '__main__':
    s = Solution()
    print(s.hammingWeight(11))
    print(s.hammingWeight2(11))
    print(s.hammingWeight(128))
    print(s.hammingWeight2(128))
